#pragma once
#include "Preprocessor.h"
#include "Shader.h"
#include "Texture.h"
#include <algorithm>
#include <glm/glm.hpp>
#include <iostream>
#include <memory>

namespace Umikaze::Core {

class Material {

  CORE_OBJECT

public:
  Material(const std::shared_ptr<Shader> &shader) { _shader = shader; }

protected:
  std::shared_ptr<Shader> _shader;

private:
  void bind(const glm::mat4 &modelMatrix,
            const std::shared_ptr<Buffer> &cameraBuffer);

  virtual void updateShader(const glm::mat4 &modelMatrix,
                            const std::shared_ptr<Buffer> &cameraBuffer) = 0;
};

} // namespace Umikaze::Core